/**
 * Clase HebraServidor: clase destinada al manejo de una conexion cliente por parte del servidor
 * bluetooth. El procedimiento visto de forma general consta de las siguientes partes: primeramente
 * el servidor acepta la peticion del cliente bluetooth y lanza una hebra para. Por otro lado el
 * servidor bluetooth recoge los parametros enviados por el cliente bluetooth y a su vez se los
 * retransmite a un servidor web; tiene por tanto un comportamiento dual: servidor bluetooth /
 * cliente web
 */

package infbsimulador.bluetooth;

// Importaciones externas
import javax.microedition.io.*;
import java.io.*;
import java.net.*;

// Importaciones internas
import infbsimulador.errores.*;


public class HebraServidor implements Runnable {

    // El cliente manejado
    private StreamConnection cliente;
    private String urlServidorWeb;
    private DataOutputStream salidaHaciaCliente;
    private DataInputStream entradaDesdeCliente;
    private Thread hiloServidor;

    public HebraServidor(StreamConnection cliente) {
        this.cliente=cliente;
        urlServidorWeb="http://"+BluetoothServidor.host+":"+BluetoothServidor.puerto+"/"+BluetoothServidor.aplicacion+"/"+BluetoothServidor.servlet;
        hiloServidor=new Thread(this);
        hiloServidor.start();
    }

    public void run() {
        int parametroBio;
        int medida;
        String respuesta;
        try{
            // Abrimos los flujos desde y hacia el cliente bluetooth
            salidaHaciaCliente=cliente.openDataOutputStream();
            entradaDesdeCliente=cliente.openDataInputStream();
            // Recogemos el parametro biometrico enviado y su valor
            parametroBio=entradaDesdeCliente.readInt();
            medida=entradaDesdeCliente.readInt();
            // Establecemos la conexion con el servlet SimulacionBiometrica del servidor web
            urlServidorWeb+="?parametro="+parametroBio+"&medida="+medida;
            URL url=new URL(urlServidorWeb);
            HttpURLConnection conexion=(HttpURLConnection)url.openConnection();
            conexion.setRequestMethod("GET");
            conexion.connect();
            // Abrimos el flujo de entrada desde el servidor web, para poder leer la respuesta
            // que nos ha enviado
            DataInputStream entradaDesdeServidor=new DataInputStream(conexion.getInputStream());
            // Leemos la respuesta del servidor y se la devolvemos al dispositivo movil cliente
            respuesta=entradaDesdeServidor.readUTF();
            salidaHaciaCliente.writeUTF(respuesta);
            salidaHaciaCliente.flush();
            // Cerramos los flujos utilizados en la conexion con el servlet
            entradaDesdeServidor.close();
            // Cerramos los flujos utilizados en la conexion con el cliente movil bluetooth
            entradaDesdeCliente.close();
            salidaHaciaCliente.close();
            // Cerramos la conexion con el cliente
            cliente.close();
        }catch(IOException ioe){
            ioe.printStackTrace();
            throw new SimuladorException("Error: Se produjo un error al obtener los flujos de entrada y/o salida asociados a la hebra de conexion del cliente al servidor bluetooth => "+"Clase: "+ioe.getClass()+", Mensaje: "+ioe.getMessage());
        }
    }

}
